package com.baomidou.springmvc.common.utils;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Random;
import java.util.UUID;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.apache.log4j.Logger;
import org.springframework.util.AntPathMatcher;
import org.springframework.web.servlet.HandlerMapping;





/**
 * 
 * @author hewei
 * @ClassName: Utils
 * @Copyright beauty_tech
 * @date 2017年5月3日 下午5:16:26
 * @description 通用工具类
 */
@SuppressWarnings({ "restriction", "unused" })
public class Utils {
	private static Logger log = Logger.getLogger(Utils.class);
	public static String trim(String str){
		if(null == str) return "";
		return str.trim();
	}


	

	/**
	 * 大陆号码或香港号码均可
	 */
	public static boolean isPhoneLegal(String str) throws PatternSyntaxException {
		return isChinaPhoneLegal(str) || isHKPhoneLegal(str);
	}

	/**
	 * 大陆手机号码11位数，匹配格式：前三位固定格式+后8位任意数 此方法中前三位格式有： 13+任意数 15+除4的任意数 18+除1和4的任意数
	 * 17+除9的任意数 147
	 */
	public static boolean isChinaPhoneLegal(String str) throws PatternSyntaxException {
		String regExp = "^((13[0-9])|(15[^4])|(18[0-9])|(17[0-8])|(147))\\d{8}$";
		Pattern p = Pattern.compile(regExp);
		Matcher m = p.matcher(str);
		return m.matches();
	}

	/**
	 * 香港手机号码8位数，5|6|8|9开头+7位任意数
	 */
	public static boolean isHKPhoneLegal(String str) throws PatternSyntaxException {
		String regExp = "^(5|6|8|9)\\d{7}$";
		Pattern p = Pattern.compile(regExp);
		Matcher m = p.matcher(str);
		return m.matches();
	}

	/**
	 * 生成uuid
	 * @description 
	 * @author hewei
	 * @title: genUUID
	 * @date 2017年5月16日 上午11:30:31
	 * @return String
	 */
	public static String genUUID(){
		UUID uuid  =  UUID.randomUUID(); 
		String s = UUID.randomUUID().toString();
		return s;
	}

	/**
	 * 
	 * @description 中文转码
	 * @author hewei
	 * @title: ISOToUTF8
	 * @date 2017年5月23日 下午12:03:09
	 * @param sourStr
	 * @return
	 * @throws UnsupportedEncodingException String
	 */
	public static String ISOToUTF8(String sourStr) {
		try{
			if(null != sourStr && sourStr.length() > 0){
				sourStr.trim();
				String destr = new String(sourStr.getBytes("ISO8859-1"),"UTF-8");
				return destr;
			}
		}catch(UnsupportedEncodingException e){
			log.error("中文转码时发生错误",e);
		}

		return "";
	}
	/**
	 * 
	 * @description 返回当前日期字符串的标准格式
	 * @author hewei
	 * @title: getFormatDate
	 * @date 2017年6月1日 下午2:51:17
	 * @param str
	 * @return String
	 */
	public static String getFormatDate(){
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		return sdf.format(new Date().getTime());
	}

	/**
	 * 返回纯数字的时间字符串yyyyMMddHHmmss
	 * @description 
	 * @author hewei
	 * @title: getNumberDateStr
	 * @date 2017年10月20日 上午11:33:07
	 * @return String
	 */
	public static String getNumberDateStr(){
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		return sdf.format(new Date().getTime()).replaceAll(" ", "").replaceAll(":", "").replaceAll("-", "");
	}
	/**
	 * 将base64转码后的字符串还原成图片
	 * @description 
	 * @author hewei
	 * @title: GenerateImage
	 * @date 2017年5月16日 下午2:47:00
	 * @param imgStr
	 * @return boolean
	 * @throws IOException 
	 */
/*	public static Json GenerateImage(String imgStr,String url,String fileName) throws IOException{ 
		OutputStream out = null;
		//对字节数组字符串进行Base64解码并生成图片  
		if (imgStr == null) //图像数据为空  
			return JsonUtil.json("上传图片失败！");  
		BASE64Decoder decoder = new BASE64Decoder();  
		try{   
			//Base64解码  
			byte[] b = decoder.decodeBuffer(imgStr);  
			for(int i=0;i<b.length;++i){  
				if(b[i]<0){  
					//调整异常数据  
					b[i]+=256;  
				}  
			}  
			//生成jpeg图片  
			String imgFilePath = url+"/"+fileName+".png";//新生成的图片  
			out = new FileOutputStream(imgFilePath);      
			out.write(b);  
			return null;  
		}   
		catch (Exception e){
			log.error("传图片时发生错误！",e);
			return JsonUtil.json("上传图片失败！");    
		}finally{
			if(out != null){
				out.flush();
				out.close();
			}
			out = null;
		} 

	}*/
	/**
	 * 获取未来几天的日期
	 * @description 
	 * @author hewei
	 * @title: getFetureDate
	 * @date 2017年6月9日 下午3:09:46
	 * @param later
	 * @return String
	 */
	public static String getFetureDate(int later) {  
		Calendar calendar = Calendar.getInstance();  
		calendar.set(Calendar.DAY_OF_YEAR, calendar.get(Calendar.DAY_OF_YEAR) + later);  
		Date today = calendar.getTime();  
		SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
		String result = format.format(today);  
		return result;  
	}
	public static String getbeforeDate(int before) {  
		Calendar calendar = Calendar.getInstance();  
		calendar.set(Calendar.DAY_OF_YEAR, calendar.get(Calendar.DAY_OF_YEAR) - before);  
		Date today = calendar.getTime();  
		SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
		String result = format.format(today);  
		return result;  
	}
	/**
	 * 
	 * @description 把时间字符串转换为毫秒
	 * @author hewei
	 * @title: dateStrToLong
	 * @date 2017年6月12日 下午2:23:25
	 * @param dateStr
	 * @return
	 * @throws ParseException long
	 */
	public static long dateStrToLong(String dateStr) {
		Calendar calendar = Calendar.getInstance();
		try {
			calendar.setTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(dateStr));
		} catch (ParseException e) {
			// TODO Auto-generated catch block
			log.error("把字符串时间转换为毫秒时发生错误",e);
			e.printStackTrace();
		}
		return calendar.getTimeInMillis();
	}
	private final static String[] agent = { "Android", "iPhone", "iPod","iPad", "Windows Phone", "MQQBrowser" }; //定义移动端请求的所有可能类型
	/**
	 * 判断User-Agent 是不是来自于手机
	 * @param ua
	 * @return
	 */
	public static boolean checkAgentIsMobile(String ua) {
		boolean flag = false;
		//排除 Windows 桌面系统    
		if (!ua.contains("Windows NT") || (ua.contains("Windows NT") && ua.contains("compatible; MSIE 9.0;"))) {
			// 排除 苹果桌面系统
			if (!ua.contains("Windows NT") && !ua.contains("Macintosh")) {
				for (String item : agent) {
					if (ua.contains(item)) {
						flag = true;
						break;
					}
				}
			}
		}
		return flag;
	}
	// 把指定URL后的字符串全部截断当成参数
	// 这么做是为了防止URL中包含中文或者特殊字符（/等）时，匹配不了的问题
	public static String extractPathFromPattern(final HttpServletRequest request)
	{
		String path = (String) request.getAttribute(HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE);
		String bestMatchPattern = (String) request.getAttribute(HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE);
		return new AntPathMatcher().extractPathWithinPattern(bestMatchPattern, path);
	}

	/**
	 * 序列化
	 * @description 
	 * @author hewei
	 * @title: serialize
	 * @date 2017年9月26日 下午4:51:34
	 * @param obj
	 * @return byte[]
	 */
	public static byte [] serialize(Object obj){
		ObjectOutputStream obi=null;
		ByteArrayOutputStream bai=null;
		try {
			bai=new ByteArrayOutputStream();
			obi=new ObjectOutputStream(bai);
			obi.writeObject(obj);
			byte[] byt=bai.toByteArray();
			return byt;
		} catch (IOException e) {
			e.printStackTrace();
		}
		return null;
	}
	/**
	 * 反序列化
	 * @description 
	 * @author hewei
	 * @title: unserizlize
	 * @date 2017年9月26日 下午4:52:16
	 * @param byt
	 * @return Object
	 */
	public static Object unserizlize(byte[] byt){
		ObjectInputStream oii=null;
		ByteArrayInputStream bis=null;
		bis=new ByteArrayInputStream(byt);
		try {
			oii=new ObjectInputStream(bis);
			Object obj=oii.readObject();
			return obj;
		} catch (Exception e) {

			e.printStackTrace();
		}
		return null;
	}
	public static <T> T getOneObject(Class<T> c) throws InstantiationException, IllegalAccessException{
		T t = c.newInstance();
		return t;
	}
	public String checkRole(HttpSession session){
		Object o = (Object)session.getAttribute("userVo");
		return null;

	}

	/**
	 * 验证身份证格式
	 * @description 
	 * @author hewei
	 * @title: verfyIC
	 * @date 2017年10月20日 下午3:24:54
	 * @param num
	 * @return boolean
	 */
	public static boolean verfyIC(String num){
		String reg = "^\\d{15}$|^\\d{17}[0-9Xx]$";
		if (!num.matches(reg)) {
			return false;
		}
		return true;
	}


	/**
	 * 生成交易订单号
	 * @description 
	 * @author hewei
	 * @title: genOutTradNo
	 * @date 2017年10月18日 下午3:33:57
	 * @return String
	 */
	public static String genOutTradNo() {
		String str = genUUID().substring(0,17)+"-"+Utils.getFormatDate().replaceAll(" ", "").replaceAll(":", "").replaceAll("-", "");
		return str;
	}
	/**
	 * 比较两个日期大小
	 * @description 
	 * @author hewei
	 * @title: compare_date
	 * @date 2017年11月1日 下午2:55:37
	 * @param DATE1
	 * @param DATE2
	 * @return int
	 */
	public static boolean compare_date(String DATE1, String DATE2,String pattern) {

		DateFormat df = new SimpleDateFormat(pattern);

		try {

			Date dt1 = df.parse(DATE1);

			Date dt2 = df.parse(DATE2);

			if (dt1.getTime() > dt2.getTime()) {
				return true;

			} else if (dt1.getTime() < dt2.getTime()) {


				return false;

			} else {

				return false;

			}

		} catch (Exception exception) {

			exception.printStackTrace();

		}

		return false;

	}
	/**
	 * 获取之前或者之后的
	 * @description 
	 * @author hewei
	 * @title: getLaterOrBeforeTimeWithHour
	 * @date 2017年11月2日 下午3:03:01
	 * @param minute
	 * @param laterOrfore
	 * @return String
	 */
	public static String getLaterOrBeforeTimeWithHour(int minute,int laterOrfore){
		Calendar calendar = Calendar.getInstance();  
		if(laterOrfore == -1){
			calendar.set(Calendar.MINUTE, calendar.get(Calendar.MINUTE) - minute);  
		}else{
			calendar.set(Calendar.MINUTE, calendar.get(Calendar.MINUTE) + minute);
		}
		
		Date today = calendar.getTime();  
		SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
		String result = format.format(today);  
		return result;
	}
	
	/**
	 * 生成特定位数(1-9位)的随机数
	 * @description 
	 * @author hewei
	 * @title: genRandomNum
	 * @date 2017年11月2日 下午10:33:06
	 * @param num
	 * @return String
	 */
	public  static String genRandomNum(int num){
		return ((long)((Math.random())*Math.pow(10, num)))+"";
	}
	
	/**
	 * 分转元或者元转分 type-0元转分，1-分转元
	 * @description 
	 * @author 小仙女
	 * @title: yuan2fenORfen2yuan
	 * @date 2017年11月7日 下午7:18:48
	 * @param amount
	 * @param amount2
	 * @param type
	 * @return int
	 */
	public static String yuan2fenORfen2yuan(String amount,String type){
		BigDecimal brate = new BigDecimal(amount);
		BigDecimal bobj = new BigDecimal("100");
		if("0".equals(type)){
			BigDecimal result = brate.multiply(bobj);
			return result.setScale(0, RoundingMode.HALF_UP).intValue()+"";
		}else{
			BigDecimal result = brate.divide(bobj);
			return (result.setScale(2, RoundingMode.HALF_UP)+"");
		}
		
	}
	public static void main(String[] args) throws ParseException, InstantiationException, IllegalAccessException, ClassNotFoundException {
		
		System.out.println(genRandomNum(22));
	}


}
